"""
机器信息服务模块

该模块提供机器信息相关的业务逻辑处理，包括获取机器列表和机器详情。
通过调用CRUD层进行数据操作，并处理业务逻辑和异常情况。
"""

from typing import List, Optional, Dict, Any
from app.models.machine import Machine
from app.crud.machine import get_machines, get_machine_by_id, get_machines_by_status, get_machine_by_ip, create_machine, update_machine, delete_machine
from sqlalchemy.orm import Session
from app.core.exceptions import AppException, NotFoundException
from app.core.performance_monitor import monitor_performance, monitor_db_performance
import logging

logger = logging.getLogger(__name__)

class MachineService:
    """机器信息服务类"""
    
    def __init__(self, db: Session):
        self.db = db
    
    @monitor_db_performance("get_machine_by_ip")
    def get_machine_by_ip(self, ip: str) -> Optional[Dict[str, Any]]:
        """根据IP获取机器
        
        Args:
            ip (str): 机器IP地址
            
        Returns:
            Optional[Dict[str, Any]]: 包含机器信息的字典或None
        """
        machine = get_machine_by_ip(self.db, ip)
        if machine:
            return machine.to_dict()
        return None
    
    @monitor_db_performance("create_machine")
    def create_machine(self, machine_data: dict) -> Dict[str, Any]:
        """创建新机器
        
        Args:
            machine_data (dict): 机器信息数据
            
        Returns:
            Dict[str, Any]: 包含创建的机器信息的字典
        """
        # 创建机器
        machine = create_machine(self.db, machine_data)
        result = machine.to_dict()
        logger.info(f"成功创建机器: {result['id']} - {result['name']}")
        return result
    
    @monitor_db_performance("get_all_machines")
    def get_all_machines(self, skip: int = 0, limit: int = 100, status: Optional[str] = None) -> List[Dict[str, Any]]:
        """获取所有机器信息
        
        Args:
            skip (int): 跳过的记录数，默认为0
            limit (int): 返回的记录数限制，默认为100
            status (Optional[str]): 按状态过滤机器
            
        Returns:
            List[Dict[str, Any]]: 包含机器信息的字典列表
        """
        if status:
            machines = get_machines_by_status(self.db, status)
            # 手动应用分页
            machines = machines[skip:skip+limit]
        else:
            machines = get_machines(self.db, skip, limit)
        result = [machine.to_dict() for machine in machines]
        logger.info(f"成功获取 {len(result)} 台机器信息 (skip={skip}, limit={limit}, status={status})")
        return result
    
    @monitor_db_performance("get_machine_detail")
    def get_machine_detail(self, machine_id: int) -> Dict[str, Any]:
        """获取单个机器详情
        
        Args:
            machine_id (int): 机器ID
            
        Returns:
            Dict[str, Any]: 包含机器详细信息的字典
            
        Raises:
            NotFoundException: 当机器不存在时抛出
        """
        machine = get_machine_by_id(self.db, machine_id)
        if not machine:
            logger.warning(f"获取机器详情失败: 机器不存在 - ID {machine_id}")
            raise NotFoundException("机器不存在")
        
        result = machine.to_dict()
        logger.info(f"成功获取机器详情: {machine_id}")
        return result

    @monitor_db_performance("update_machine")
    def update_machine(self, machine_id: int, machine_data: dict) -> Optional[Dict[str, Any]]:
        """更新机器信息
        
        Args:
            machine_id (int): 机器ID
            machine_data (dict): 机器信息数据
            
        Returns:
            Optional[Dict[str, Any]]: 更新后的机器信息
            
        Raises:
            NotFoundException: 当机器不存在时抛出
        """
        machine = update_machine(self.db, machine_id, machine_data)
        if machine:
            result = machine.to_dict()
            logger.info(f"成功更新机器信息: {machine_id}")
            return result
        logger.warning(f"更新机器信息失败: 机器不存在 - ID {machine_id}")
        raise NotFoundException("机器不存在")

    @monitor_db_performance("delete_machine")
    def delete_machine(self, machine_id: int) -> bool:
        """删除机器(软删除)
        
        Args:
            machine_id (int): 机器ID
            
        Returns:
            bool: 删除成功返回True，机器不存在返回False
            
        Raises:
            NotFoundException: 当机器不存在时抛出
        """
        success = delete_machine(self.db, machine_id)
        if success:
            logger.info(f"成功删除机器: {machine_id}")
            return True
        logger.warning(f"删除机器失败: 机器不存在 - ID {machine_id}")
        raise NotFoundException("机器不存在")

    @monitor_db_performance("update_machine_status_from_metrics")
    def update_machine_status_from_metrics(self, machine_id: int, cpu: int, memory: int, disk: int) -> Optional[Dict[str, Any]]:
        """根据监控指标更新机器状态
        
        Args:
            machine_id (int): 机器ID
            cpu (int): CPU使用率
            memory (int): 内存使用率
            disk (int): 磁盘使用率
            
        Returns:
            Optional[Dict[str, Any]]: 更新后的机器信息
        """
        from app.crud.machine import update_machine_metrics
        machine = update_machine_metrics(self.db, machine_id, cpu, memory, disk)
        if machine:
            return machine.to_dict()
        return None